home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 126-150 / disk_134 / dme / refs.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  4KB  |  167 lines

  1.  
  2. /*
  3.  *  REFS.C
  4.  *
  5.  *  Bringup a cross reference editor window.  The file S:dme.refs and
  6.  *  dme.refs in the current directory are searched for the reference.
  7.  *  If found, the file specified is searched and the segment specified
  8.  *  loaded as a new file in a new window.
  9.  */
  10.  
  11. #include "defs.h"
  12. #include <stdio.h>
  13.  
  14. extern char *breakout();
  15.  
  16.  
  17. void
  18. do_refs()
  19. {
  20.     char str[256];
  21.     char *srch;
  22.     char *file;
  23.     char *estr;
  24.     long len;
  25.     int bcnt = 10;
  26.     register short i, j;
  27.     short slen, elen;
  28.     long xfi, xfj;
  29.     short tmph, tmpw;
  30.  
  31.     for (i = Ep->Column; Current[i] == ' '; ++i);     /*  skip spaces     */
  32.     for (j = i       ; ; ++j) {
  33.     if (Current[j] && Current[j] != ' ')
  34.         continue;
  35.     break;
  36.     }
  37.     j -= i;
  38.     if (j > 63)
  39.     j = 63;
  40.     bmov(Current+i, str, j);
  41.     str[j] = 0;
  42.     title("search .refs");
  43.     if (!searchref("s:dme.refs",    str,&srch,&file,&len,&estr) &&
  44.     !searchref("dme.refs",      str,&srch,&file,&len,&estr) &&
  45.     !searchref("df0:s/dme.refs",str,&srch,&file,&len,&estr) &&
  46.     !searchref("df1:s/dme.refs",str,&srch,&file,&len,&estr) &&
  47.     !searchref("df2:s/dme.refs",str,&srch,&file,&len,&estr) &&
  48.     !searchref("df3:s/dme.refs",str,&srch,&file,&len,&estr)
  49.     ) {
  50.     title("Reference not found");
  51.     return;
  52.     }
  53.     title("search file");
  54.     slen = strlen(srch);
  55.     if (estr)
  56.     elen = strlen(estr);
  57.     if (xfi = xfopen(file, "r", 4096)) {
  58.     short lenstr;
  59.     while ((lenstr = xefgets(xfi, str, 256)) >= 0) {
  60.         if (strncmp(str, srch, slen) == 0) {
  61.         title("load..");
  62.         if (xfj = xfopen("t:dme_ref", "w", 1024)) {
  63.             tmph = 0;
  64.             tmpw = 0;
  65.             do {
  66.             if (lenstr > tmpw)
  67.                 tmpw = strlen(str);
  68.             ++tmph;
  69.             xfwrite(xfj, str, strlen(str));
  70.             xfwrite(xfj, "\n", 1);
  71.             if (estr && strncmp(str,estr,elen) == 0)
  72.                 break;
  73.             --len;
  74.             } while ((lenstr=xefgets(xfi, str, 256)) >= 0 && len);
  75.             xfclose(xfj);
  76.             if (tmph > 23)
  77.             tmph = 23;
  78.             if (tmpw > 80)
  79.             tmpw = 80;
  80.             sprintf(str, "tmpheight %ld tmpwidth %ld newwindow newfile t:dme_ref", (tmph<<3)+16, (tmpw<<3)+16);
  81.             do_command(str);
  82.             unlink("t:dme_ref");
  83.         } else {
  84.             title("Unable to open t:dme_ref for write");
  85.         }
  86.         xfclose(xfi);
  87.         free(srch);
  88.         free(file);
  89.         if (estr)
  90.             free(estr);
  91.         return;
  92.         }
  93.         if (--bcnt == 0) {      /* check break every so so  */
  94.         bcnt = 50;
  95.         if (breakcheck())
  96.             break;
  97.         }
  98.     }
  99.     xfclose(xfi);
  100.     title("Search failed");
  101.     } else {
  102.     title("Unable to open sub document");
  103.     }
  104.     free(srch);
  105.     free(file);
  106.     if (estr)
  107.     free(estr);
  108. }
  109.  
  110. /*
  111.  *  Reference file format:
  112.  *
  113.  *  `key' `lines' `file' `searchstring'
  114.  *
  115.  *  where `lines' can be a string instead ... like a read-until, otherwise
  116.  *  the number of lines to read from the reference.
  117.  */
  118.  
  119. searchref(file, find, psstr, pfile, plines, pestr)
  120. char *file, *find;
  121. char **psstr, **pfile, **pestr;
  122. long *plines;
  123. {
  124.     long xfi;
  125.     char buf[256];
  126.     char *ptr, *base;
  127.     char quoted;
  128.  
  129.     mountrequest(0);
  130.     if (xfi = xfopen(file, "r", 4096)) {
  131.     while (xefgets(xfi,(base=buf), 256) >= 0) {
  132.         if (buf[0]=='#')
  133.         continue;
  134.         ptr = breakout(&base, "ed);
  135.         if (ptr && *ptr && strncmp(ptr, find, strlen(ptr)) == 0) {
  136.         if (ptr = breakout(&base, "ed)) {
  137.             *pestr = NULL;
  138.             *plines = atoi(ptr);
  139.             if (*plines == 0) {
  140.             *pestr = (char *)malloc(strlen(ptr)+1);
  141.             strcpy(*pestr, ptr);
  142.             }
  143.             if (ptr = breakout(&base, "ed)) {
  144.             *pfile = (char *)malloc(strlen(ptr)+1);
  145.             strcpy(*pfile, ptr);
  146.             if (ptr = breakout(&base, "ed)) {
  147.                 *psstr = (char *)malloc(strlen(ptr)+1);
  148.                 strcpy(*psstr, ptr);
  149.                 xfclose(xfi);
  150.                 mountrequest(1);
  151.                 return(1);
  152.             }
  153.             free(*pfile);
  154.             }
  155.             if (pestr)
  156.             free (*pestr);
  157.         }
  158.         }
  159.     }
  160.     xfclose(xfi);
  161.     }
  162.     mountrequest(1);
  163.     return(0);
  164. }
  165.  
  166.  
  167.